<?php
/**
 * @package PWE.modele
 * @author Gmax <gmaxfr78@gmail.com>
 */
class modele_permalien extends modele {
    protected static $_table = 'permalien';
    
    private $_modele = '';
    private $_modele_id = 0;
    private $_lien = '';
    private $_titre_seo = '';
    private $_description_seo = '';
    
    private static $_extensions = array(
        'page'=>'.html',
        'galerie'=>'.html',
        'publication'=>'.html',
        'tag'=>'',
        'category'=>''
    );
    
    //redirection auto à la mise à jour du permalien
    private $_create_redirection = false;
    private $_old_lien = '';
            
    function __construct($modele='',$modele_id=0){
        if($modele!==''){
            $this->_modele = $modele;
            if($modele_id>0){
                $this->_modele_id = $modele_id;
                $this->_constructObject();
            }
        }
    }
    private function _constructObject(){
        $sqlQuery = 'SELECT * FROM '.self::getTable().' AS t ';
        $sqlQuery .= 'WHERE t.modele="'.$this->_modele.'" AND t.modele_id='.$this->_modele_id.' LIMIT 1';
        
        $datas = $this->_getOneResult($sqlQuery);
        if($datas){
            $this->_lien = $datas['lien'];
            $this->_titre_seo =  $datas['titre_seo'];
            $this->_description_seo =  $datas['description_seo'];
        }else{
            $this->save();
        }
    }
    /**
     * renvoi le modele d'object
     * @return string
     */
    public function getModele(){
        return $this->_modele;
    }
    /**
     * renvoi l'id du modele
     * @return int
     */
    public function getModeleId(){
        return $this->_modele_id;
    }
    /**
     * renvoi le lien
     * @return string
     */
    public function getLien(){
        return $this->_lien;
    }
    public function getTranslatedLien($lang=''){
        $translate = modele_translate::findObjectProperty($this->getModeleId(),$this->getModele(), 'lien', $lang);
        $retour = ($translate!==null)?$translate->getContent():$this->_lien;
        return $retour;
    }
    /**
     * renvoi l'extension de fichier selon le modele
     * @return string
     */
    public function getExtension(){
        $ext = '';
        if(isset(self::$_extensions[$this->getModele()])){
            $ext = self::$_extensions[$this->getModele()];
        }
        return $ext;
    }
    
    public function getDescription($input=false){
        if($input)return $this->inputFormat($this->_description_seo);
        else return $this->outputFormat($this->_description_seo);
    }
    public function getTitre($input=false){
        if($input)return $this->inputFormat($this->_titre_seo);
        else return $this->outputFormat($this->_titre_seo);
    }
    /**
     * renvoi l'objet cible du permalien
     * @return null|\modele
     */
    public function getTargetObject(){
        $target = null;
        eval('$target = new modele_'.$this->getModele().'('.$this->getModeleId().');');
        return $target;
    }
    
    public function getDatas($input=false){
        $datas = array(
            'modele'=>$this->getModele(),
            'modele_id'=>$this->getModeleId(),
            'lien'=>$this->getLien(),
            'description_seo'=>$this->getDescription($input),
            'titre_seo'=>$this->getTitre($input)
        );
        return $datas;
    }
    public function setDatas($datas) {
        $lien='';
        foreach($datas as $k=>$v){
            if(substr($k, 0, 1) !== '_') $k = '_'.$k;
            if(property_exists(get_class($this),$k)){
                if($k==='_lien'){
                    $lien = $v;
                }elseif($k!=='_modele'){
                    $this->$k = $v;
                }
            }
        }
        if($lien!==''){
            $lien = $this->cleanLien($lien);
            if($this->getLien()!=='' && $lien!==$this->getLien()){
                $this->_create_redirection = true;
                $this->_old_lien = $this->getLien();
                $this->_lien = $lien;
            }else{
                $this->_lien = $lien;
            }
        }
        return true;
    }
    
    public function chekPermalien(){
        $sql = 'SELECT * FROM '.self::getTable().' WHERE modele="'.$this->getModele().'" AND lien="'.$this->getLien().'"';
        $result = bdd_sql::doSql($sql);
        if($result['count']>0){
            $this->_lien = $this->cleanLien($this->getCleanedLien(false).'-'.$this->getModeleId());
            return $this->chekPermalien();
        }else{
            return $this->getLien();
        }
    }
    
    /**
     * vérifie l'exension en fin de lien
     * @param string $lien
     * @param boolean $withExt ajoute ou enlève l'extension
     * @return string
     */
    public function cleanLien($lien,$withExt=true){
        foreach(self::$_extensions as $ext){
            $lien = str_replace(strtolower($ext), '', strtolower($lien));
        }
        $retour = $lien;
        if($withExt){$retour .= $this->getExtension();}
        return $retour;
    }
    public function getCleanedLien($withExt=true){
        return $this->cleanLien($this->getLien(),$withExt);
    }
    public function getCleanedTranslatedLien($lang='',$withExt=true){
        return $this->cleanLien($this->getTranslatedLien($lang),$withExt);
    }
    
    public function save(){
        $retour = array('success'=>false,'datas'=>array());
        $this->_lien = $this->chekPermalien();
        if($this->getLien()!==''){
            $sqlQuery = 'INSERT INTO '.self::getTable().' ';
            $sqlQuery .= '(modele,modele_id,lien,titre_seo,description_seo) ';
            $sqlQuery .= 'VALUES (';
            $sqlQuery .= '"'.$this->getModele().'",';
            $sqlQuery .= $this->getModeleId().',';
            $sqlQuery .= '"'.$this->getLien().'",';
            $sqlQuery .= '"'.$this->getTitre(true).'",';
            $sqlQuery .= '"'.$this->getDescription(true).'"';
            $sqlQuery .= ')';
            bdd_sql::doSql($sqlQuery,false);
            $retour['success'] = true;
            $retour['datas'] = $this->getDatas();
        }
        return $retour;
    }
    public function update(){
        // si redirection
        if($this->_create_redirection){
            $redirection = new modele_redirection();
            $redirection->create($this->_old_lien,$this->getTargetObject());
            $this->_lien = $this->chekPermalien();
        }
        
        $sqlQuery = 'UPDATE '.self::getTable().' SET ';
        $sqlQuery .= 'lien="'.$this->getLien().'", ';
        $sqlQuery .= 'titre_seo="'.$this->getTitre(true).'", ';
        $sqlQuery .= 'description_seo="'.$this->getDescription(true).'" ';
        $sqlQuery .= 'WHERE modele="'.$this->getModele().'" AND modele_id='.$this->getModeleId().' LIMIT 1';
                
        bdd_sql::doSql($sqlQuery,false);

        return array('success'=>true,'datas'=>$this->getDatas());
    }
    
    public function delete() {
        $sqlDelete = 'DELETE FROM '.self::getTable().' WHERE modele="'.$this->getModele().'" AND modele_id='.$this->getModeleId();
        bdd_sql::doSql($sqlDelete,false);
        return array('success'=>true,'datas'=>array());
    }
    
    /* méthodes static */
    /**
     * renvoi l'extension de fichier en fonction du modele
     * @param string $modele
     * @return string
     */
    public static function getExtensionByModele($modele='modele_category'){
        $modele = str_replace('modele_', '', $modele);
        $ext = '';
        if(isset(self::$_extensions[$modele])){
            $ext = self::$_extensions[$modele];
        }
        return $ext;
    }
    /**
     * 
     * @return string
     */
    public static function getTable(){
        return PWE::getPrefixBdd().self::$_table;
    }
}

?>
